package com.jy.wms.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import com.jy.wms.common.annotions.BaseServiceDescribe;
import com.jy.wms.common.base.BaseService;
import com.jy.wms.common.base.ServiceException;
import com.jy.wms.common.base.SucessException;
import com.jy.wms.dao.SysMenuMapper;
import com.jy.wms.pojo.SysMenu;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @ClassName: SysMenuService.java
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @Author lh
 * @Date Tue Aug 29 15:29:31 GMT+08:00 2017
 */

@Service
public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {

    /**
     * 插入一条记录
     *
     * @param entity   实体对象
     * @return int
     */

    @BaseServiceDescribe(moduleName = "菜单添加", btnName = "增加菜单")
    public void baseInsert(SysMenu entity) throws ServiceException, SucessException {
            entity.setLabel(entity.getMc());
            entity.setNavigateUrl(entity.getLj());
            entity.setMenuCode(entity.getCode());
            entity.setFid(entity.getFjd());
            if ("0".equals(entity.getSq())) {
                entity.setShow_sq("不可用");
            } else if ("1".equals(entity.getSq())) {
                entity.setShow_sq("可用");
            }
            Integer a= dao.baseInsert(entity);
            if(a>0){
                throw new SucessException("菜单添加成功");
            }else{
                throw  new ServiceException("菜单添加失败");
            }
       /* entity.setLabel(entity.getMc());
        entity.setNavigateUrl(entity.getLj());
        entity.setMenuCode(entity.getCode());
        entity.setFid(entity.getFjd());
        if (entity.getSq().equals("0")) {
            entity.setShow_sq("不可用");
        } else if (entity.getSq().equals("1")) {
            entity.setShow_sq("可用");
        }
        return dao.baseInsert(entity, database);*/
    }

    /**
     * 插入一条记录（匹配有值的字段）
     *
     * @param entity   实体对象
     * @param database 数据库名称
     * @return int
     */
    public Integer baseInsertSelective(SysMenu entity, String database) {
        return dao.baseInsertSelective(entity, database);
    }

    /**
     * 删除（根据主键ID删除）
     *
     * @param id       主键
     * @return int
     */
    public Integer baseDeleteByPrimaryKey(String id) {
        int a = dao.baseDeleteByPrimaryKey(id);
        int b = dao.deleteRoleMenu(id);//删除菜单的同事删除角色菜单表的相关记录

        return a;
    }

    /**
     * 删除（根据ID 批量删除）
     *
     * @param idList   主键ID列表
     * @return int
     */
    public Integer baseDeleteBathPrimaryKeys(List<String> idList) {
        for (String id : idList) {
            dao.deleteRoleMenu(id);
        }

        return dao.baseDeleteBathPrimaryKeys(idList);
    }

    /**
     * 分页查询
     *
     * @param entity   实体
     * @param database 数据库名称
     * @return Page<SysMenu>
     */
    @BaseServiceDescribe(moduleName = "菜单分页查询", btnName = "菜单查询")
    public Page<SysMenu> baseSelectPage(SysMenu entity, String database) {
        //PageHelper.startPage(entity.getPageNum(),entity.getPageSize());
        PageHelper.startPage(entity.getPage(), entity.getRows());
        return (Page<SysMenu>) dao.baseSelectPage(entity, database);
    }

    /**
     * 查询（根据主键ID查询）
     *
     * @param id       主键ID
     * @param database 数据库名称
     * @return SysMenu
     */
    public SysMenu baseSelectByPrimaryKey(String id, String database) {
        return dao.baseSelectByPrimaryKey(id);
    }

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList   主键ID列表
     * @param database 数据库名称
     * @return list
     */
    public Integer baseSelectBathPrimaryKeys(List<SysMenu> idList, String database) {
        return dao.baseSelectBathPrimaryKeys(idList, database);
    }

    /**
     * 修改 （匹配有值的字段）
     *
     * @param entity   主键ID列表
     * @return int
     */
    @BaseServiceDescribe(moduleName = "修改菜单", btnName = "菜单修改")
    public void baseUpdateByPrimaryKeySelective(SysMenu entity) throws ServiceException,SucessException {
        entity.setLabel(entity.getMc());
        entity.setNavigateUrl(entity.getLj());
        entity.setMenuCode(entity.getCode());
        entity.setFid(entity.getFjd());
        if ("0".equals(entity.getSq())) {
            entity.setShow_sq("不可用");
        } else if ("1".equals(entity.getSq())) {
            entity.setShow_sq("可用");
        }
        Integer count=  dao.getCountByCode(entity.getCode(),entity.getMc(),entity.getId());
        if(count>0){
            throw new ServiceException("菜单项编码或名称重复,修改失败");
        }else{
            Integer a= dao.baseUpdateByPrimaryKeySelective(entity);
            if(a>0){
                throw new SucessException("菜单修改成功");
            }else{
                throw  new ServiceException("菜单修改失败");
            }
        }
    }

    /**
     * 修改（根据主键ID修改）
     *
     * @param entity   主键ID列表
     * @param database 数据库名称
     * @return int
     */
    public Integer baseUpdateByPrimaryKey(SysMenu entity, String database) {
        return dao.baseUpdateByPrimaryKey(entity, database);
    }

    private List<SysMenu> list;


    public Integer getCountByCode( String code, String mc, String id) {
        return dao.getCountByCode(code, mc,id);
    }

    /**
     * 查询（根据父节点查询）
     *
     * @param fjd      父节点
     * @param database 数据库名称
     * @return SysMenu
     */
    public List<SysMenu> selectByFjd(String fjd, String database) {
        return dao.selectByFjd(fjd);
    }

    /**
     * 菜单调整顺序时调整原先位置（被占用）的菜单的顺序
     *
     * @param fjd
     * @param wzNew
     * @param wzOld
     * @return
     */
    @BaseServiceDescribe(moduleName = "菜单调整顺序时调整原先位置（被占用）的菜单的顺序", btnName = "调整菜单顺序")
    public int updateOrderOther(String fjd, String wzNew, String wzOld) {
        return dao.updateOrderOther(fjd, wzNew, wzOld);
    }

    /**
     * 修改当前菜单的位置
     *
     * @param id
     * @param wzNew
     * @return
     */
    @BaseServiceDescribe(moduleName = "修改当前菜单的位置", btnName = "调整菜单顺序")
    public int updateOrderSelf(String id, Integer wzNew) throws Exception {
        int a;
        try {
             a = dao.updateOrderSelf(id, wzNew);
        } catch (Exception e) {
            throw new ServiceException();
        }
        return a;
            /*if(a>0){
                return a;
            }else{
                throw  new ServiceException();
            }*/
    }

    public void updateWz(Map<String,Object> map) throws ServiceException, SucessException {
        String id = map.get("id").toString();
        SysMenu menu = dao.baseSelectByPrimaryKey(id);
        int showOrder = (Integer)map.get("showOrder");//1或-1
        int wzOld = Integer.parseInt(menu.getWz().toString());//原来的顺序
        int wzNow = wzOld + showOrder;//现在的新的顺序
        List<SysMenu> mlist = dao.selectByFjd(menu.getFjd());//查找对应父节点下的集合
        if (wzNow > 0 && wzNow <= mlist.size()) {
            int other = dao.updateOrderOther(menu.getFjd(), String.valueOf(wzNow), String.valueOf(wzOld)); //修改原来位置菜单的位置
            int self = dao.updateOrderSelf(id, wzNow);
            if(other>0&&self>0){
                throw new SucessException("菜单顺序调整成功");
            }else{
                throw new ServiceException("菜单顺序调整失败");
            }
        } else {
            throw  new SucessException("菜单顺序不可调整");
            //json = SetStatus.setFunctionType(1, "error", "菜单顺序调整", "菜单顺序不可调整", "");
        }

    }
}
